#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

typedef struct {
	int inicio;
	int fin;
} Curso;

void leerStdin();
vector<Curso> elegir_cursos(int cantCursos, vector<Curso> cursos);
bool snd_order(Curso, Curso);
ostream& operator<<(ostream &os, vector<Curso>);

int main(int argc, char *argv[]) {
	leerStdin();
	return 0;
}

void leerStdin() {
	while(1){
		/* Leer instancia */
		int cantCursos(0);
		Curso curso;
		vector<Curso> cursos(cantCursos);

		if(!(cin >> cantCursos)) break;

		for(int i = 0; i < cantCursos; i++) {
			cin >> curso.inicio;
			cin >> curso.fin;
			cursos.push_back(curso);
		}				
		cout << elegir_cursos(cantCursos, cursos);
	}
}

vector<Curso> elegir_cursos(int cantCursos, vector<Curso> cursos) {
	int ultima_fecha = 0;
	vector<Curso> resultado;
	
	make_heap(cursos.begin(), cursos.end(), snd_order);
	
	for(int i = 0; i < cantCursos; i++) {
		if(cursos.front().inicio <= ultima_fecha){
			//Si la fecha de finalización del curso es mayor (o igual tmb?) a ultima_fecha lo elimino
			pop_heap(cursos.begin(), cursos.end(), snd_order); //Mandamos el primer elemento al final de la lista
			cursos.pop_back(); //eliminamos el último elemento
		} else {
			ultima_fecha = cursos.front().fin;
			resultado.push_back(cursos.front());
			pop_heap(cursos.begin(), cursos.end(), snd_order); //Mandamos el primer elemento al final de la lista
			cursos.pop_back(); //eliminamos el último elemento
		}
	}
	return resultado;
}

bool snd_order(Curso c1, Curso c2) {
	return (c1.fin > c2.fin); // originalmente estaba c1.fin < c2.fin ... pero me parece que va mayor en realidad
}
	
ostream& operator<<(ostream &os, vector<Curso> cursos) {
	os << cursos.size() << " ";
	for(int i = 0; i < cursos.size(); i++){
		os << cursos[i].inicio << " " << cursos[i].fin << " "; 
	}
	os << endl;
}
